原理:「點擊 AccordionTitle
部位後,顯示下方的 AccordionBody
內容」。
不過為了還原 MUI Accordion 的結構,實作時使用了 React.cloneElement
來讓 title 與 body 部位可以作為 children 被包進 Accordion
元件中。
以下為您獻上原始碼 ─=≡Σ((( つ•̀ω•́)つ
把之前做好的 ButtonBase
找出來,設定滿版寬(width: 100%
)再把 ExpendLessIcon
放上去,基本外觀完成。
而在 Accordion 進入 open
狀態時,透過 transform: rotate(180deg);
旋轉 ExpendLessIcon
的方向,搞定。
基本上僅負責處理 Accordion 開關的動畫效果。
重點:透過 React.Children
來取出傳入 Accordion
元件中排序為 0 與 1 的 child node 設定為 AccordionTitle
與 AccordionBody
/* Hooks */
useEffect(() => {
React.Children.forEach(children, (child, index) => {
const childElement = child as JSX.Element;
if (index === 0) {
setTitleElement(
React.cloneElement(childElement, {
open: openToUse,
onClick: hasOpenFromProps ? undefined : toggleAccordion,
accordionTitleClass: classes.title,
})
);
}
if (index === 1) {
setBodyElement(
React.cloneElement(childElement, {
open: openToUse,
accordionBodyClass: cn(openToUse && defaultBodyStyle, classes.body),
})
);
}
});
}, [
children,
openToUse,
hasOpenFromProps,
classes.title,
classes.body,
toggleAccordion,
]);
變數 hasOpenFromProps
是為了明天的 Accordions
元件設置,在今天的展示情境(每一個 Accordion
元件的開關狀態各自獨立時)暫時還不會用到,先跳過。
截稿前沒做出 MUI Accordion 的元件開關動畫效果,到目前為止體感上做動畫比設計邏輯難。